package rastreamento
{
	import application.Application;
	import application.ApplicationConstants;
	
	import flash.events.Event;
	import flash.events.MouseEvent;
	
	import login.Usuario;
	
	import mx.controls.Alert;
	import mx.events.FlexEvent;
	
	import utils.http.FailureResponse;
	import utils.http.SuccessResponse;
	import utils.http.builder.HttpConnectorBuilder;
	
	public class RastreamentoController
	{
		
		public var rastreamentoCentralPanel:RastreamentoCentralPanel;
		
		public var dispositivos:Array;
		
		public function RastreamentoController()
		{
			rastreamentoCentralPanel = new RastreamentoCentralPanel();
			rastreamentoCentralPanel.addEventListener(FlexEvent.INITIALIZE, function(event:Event):void {
				rastreamentoCentralPanel.showDispositivo.addEventListener(MouseEvent.CLICK, showDispositivo);
				rastreamentoCentralPanel.hideDispositivo.addEventListener(MouseEvent.CLICK, hideDispositivo);
				updateTree();
			});
			
		}

		public function getSelectedDispositivo():RastreamentoDispositivo {
			var node:XML = XML(rastreamentoCentralPanel.tree.selectedItem);
			
            if( node == null ) return null;
            if( node.localName() != "leaf" ) return null;
        
        	var nome:String = node.@label; 
        
        	if (dispositivos == null || dispositivos.length == 0) return null;
        
        	for (var i:int = 0; i < dispositivos.length; i++) {
        		var dispositivo:RastreamentoDispositivo = (dispositivos[i] as RastreamentoDispositivo);
        	
        		if (dispositivo.nome == nome) {
        			return dispositivo;
        		}
        	}
        
        	return null;
		}

		public function showDispositivo(event:Event):void {
			var selectedDispositivo:RastreamentoDispositivo = getSelectedDispositivo();

			// 1- Verificar se o dispositivo já está na tela.
			if (verificaDispositivoVisible(selectedDispositivo)) {
				return;
			}
			
			// 2- Criar novo MapWindow
			var map:MapWindow = new MapWindow();
			map.dispositivo = selectedDispositivo;
			
			// 3- Adicionar o MapWindow na tela
			rastreamentoCentralPanel.mapsTile.addChild(map);
		}

		public function hideDispositivo(event:Event):void {
			var selectedDispositivo:RastreamentoDispositivo = getSelectedDispositivo();

			// 1- Verificar se o dispositivo já está na tela.
			if (verificaDispositivoVisible(selectedDispositivo)) {

				// 2- Esconder e remover MapWindow
				var map:MapWindow = getMapWindowFromDispositivo(selectedDispositivo);
				rastreamentoCentralPanel.mapsTile.removeChild(map);
				map.finish();
			}
		}

		public function getMapWindowFromDispositivo(dispositivo:RastreamentoDispositivo):MapWindow {
			var children:Array = rastreamentoCentralPanel.mapsTile.getChildren();
			
			for (var i:int = 0; i < children.length; i++) {
				var map:MapWindow = (children[i] as MapWindow);
				if (map.dispositivo == dispositivo) {
					return map;
				}
			}	
			return null;		
		}

		public function verificaDispositivoVisible(dispositivo:RastreamentoDispositivo):Boolean {
			return (getMapWindowFromDispositivo(dispositivo) != null);
		}

		/* This is an story function */
		public function updateTree():void {
			var usuarioLogado:Usuario = (Application.get().getAttribute(ApplicationConstants.USUARIO_LOGADO_ATTR) as Usuario);
			
			// 1- Pegar a lista de rastreaveis do servidor.
			getDispositivosFromServer(usuarioLogado, function(beans:Array) {
				dispositivos = beans;
				
				// 2- Inserir na tree.
				var treeFeed:XML = new XML("<root label=\"Dispositivos\"></root>");
				treeFeed.appendChild("<branch id=\"naoAgrupado\" label=\"Não Agrupado\"></branch>");
				
				for	(var i:int = 0; i < beans.length; i++) {
					var dispositivo:RastreamentoDispositivo = (beans[i] as RastreamentoDispositivo);
					treeFeed.child("branch").appendChild("<leaf label=\""+ dispositivo.nome +"\"></leaf>");
				}

				rastreamentoCentralPanel.tree.dataProvider = treeFeed;
			} );
		}

		public function getDispositivosFromServer(usuario:Usuario, onSuccess:Function):void {
			var constant:String = ApplicationConstants.DISPOSITIVOS_FROM_USUARIO;
			var params:String = ("codigoEmpresa=" + usuario.codigoEmpresa);
			
			var url:String = ApplicationConstants.getUrl(constant, params);

			var conn:HttpConnectorBuilder = new HttpConnectorBuilder(url).methodGet().secure(true);
			
			conn.onSuccess(function(response:SuccessResponse):void {
				var xml:XML = new XML(response.content);
				
				var beans:Array = new Array();
				
				for (var i:int = 0; i < xml.children().length(); i++) {
					var dis:RastreamentoDispositivo = new RastreamentoDispositivo(xml.*[i].nome, xml.*[i].serial);
					beans[i] = dis;
				}
				
				onSuccess.apply(null, new Array(beans));
			});
			
			conn.onFailure(function(response:FailureResponse):void {
				Alert.show(response.responseMessage);
			});
			
			conn.connect();
		}

		

	}
}